/*
var re = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;等号右边是个正则表达式
以下进行详细说明：
1、正则表达式总是以斜杠开头和结尾，斜杠之间的所有内容都是正则表达式的组成部分；
2、脱字符（^）表示要使用这个表达式检查以特定的字符串开头的字符串；
3、表达式\w表示任意单一字符，包括a~z、A~Z、0-9或下划线；
4、加号+表示要寻找前面条目的一次或多次出现。邮箱地址必须以字符a~z、A~Z、0-9或下划线的任意组合开头；
5、方括号[表示可以出现其中的任意一个字符。上述示例中包含字符\.-，允许输入点号或连字符，但是点号对于正则表达式有特殊意义，所以需要在前面加上转义字符反斜杠\；
6、问号？表示前面的条目可以不出现或出现一次。所以邮箱地址的第一部分（@前面的部分）中可以有一个点号或一个连字符，也可以没有；
7、在？后面，在此出现\w+，表示点号或连字符后面必须要有其他一些字符；
8、星号*表示前面的条目（圆括号中的所有内容）可以不出现或者出现多次，如前缀wwb0515可以，另w.wb-05-15也可以；
9、@字符代表自身，位于邮箱地址前缀和域名之间；
10、再次使用\w+，表示域名必须要以一个或多个a~z、A~Z、0-9或下划线字符开头；在此之后还是([\.-]?\w+)*，表示后缀中允许有点号或连字符；
11、然后，(\.\w{2,3})，表示希望有一个点号，后面跟着一些字符，花括号中的数字表示前面的条目（\w,表示字母、数字或下划线）可以出现2或3次；
之后后面有个+，表示圆括号这个组要出现一次或多次，如.com或.cn，也可以是.edu.cn或.com.cn；
12、最后，正则表达式的末尾是一个美元符号$，这表示匹配的字符串必须在这里结束。能使脚本拒绝开头正确，末尾包含垃圾字符的邮箱地址；斜杠结束正则表达式。

正则表达式中的特殊字符：
^字符串的开始
$字符串的结尾
*零次或多次
+一次或多次
？零次或一次
*/

window.onload = initForms;

/*此函数循环遍历页面上的每个表单，为每个表单添加onsubmit事件处理*/
function initForms() {
	for (var i = 0; i < document.forms.length; i++) {
		//验证表单函数，返回false，表单不会被传递给服务器；只有返回true时，服务器才收到表单
		document.forms[i].onsubmit = function () {
			return validForm();
		}
	}
}
//验证表单函数
function validForm() {
	var allGood = true;//验证表单函数
	var allTags = document.getElementsByTagName("*");//得到所有标签

	for (var i = 0; i < allTags.length; i++) {
		if (!validTag(allTags[i])) {//检查每个标签，是否有东西阻止表单提交
			allGood = false;
		}
	}
	return allGood;

	//验证标签函数，返回值为true或false，true代表验证成功，false代表验证失败
	function validTag(thisTag) {
		var outClass = "";
		/*split() 方法用于把一个字符串分割成字符串数组，会按照传递给她的字符串，将字符串分割成数组
		在下面语句中，分隔符字符串是一个空格，如字符串：I am wwb，会被分割成3个元素的数组，I，am，wwb
		*/
		var allClasses = thisTag.className.split(" ");

		for (var j = 0; j < allClasses.length; j++) {//循环遍历，把调用validBasedOnClass函数后的返回值添加到outclass中
			outClass += validBasedOnClass(allClasses[j]) + " ";
		}

		thisTag.className = outClass;//把outclass放到thistag.classname中，会覆盖表单字段当前的class属性

		if (outClass.indexOf("invalid") > -1) {//如果outclass中包含invalid
			invalidLabel(thisTag.parentNode);//把此标签的父标签也定义为无效的
			thisTag.focus();//这个标签获得焦点，以便让用户知道哪个字段有问题
			if (thisTag.nodeName == "INPUT") {//如果这个标签是input标签，就选择它的值，以便让用户进行修改
				thisTag.select();
			}
			return false;
		}
		return true;

		//验证结果函数，无效返回值中添加invalid，有效返回中不添加
		function validBasedOnClass(thisClass) {
			var classBack = "";//创建返回值：classback变量，并初始化为空

			switch (thisClass) {
				case "":
				case "invalid":
					break;
				case "email":
					if (allGood && !validEmail(thisTag.value)) classBack = "invalid ";
				default:
					classBack += thisClass;
			}
			return classBack;
		}
		//利用正则表达式来验证邮箱，最简练的方式		
		function validEmail(email) {
			// var re = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
			var re = [/[A-Z]/, /[a-z]/, /\d/, /[\.@-]/];
			var k = 0;
			for (var i = 0; i < re.length; i++) {
				if (re[i].test(email)) {
					k++;
				}
			}
			return k > 2;
			// return re.test(email);//验证邮箱地址的有效性
		}
		/*
		标识出有问题的表单字段，识别出有错误的字段的父标签
		*/
		function invalidLabel(parentTag) {
			if (parentTag.nodeName == "LABEL") {
				parentTag.className += " invalid";
			}
		}
	}
}
